﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.ModelBinding;
using System.Web.UI;
using System.Web.UI.WebControls;
using Box.BL;
using Box.Entities;
using Microsoft.Practices.Unity;

namespace WEB
{
    public partial class frmVentas : System.Web.UI.Page
    {
        [Dependency]
        public IProductoBL productoService { get; set; }

        [Dependency]
        public IVentaBL ventaService { get; set; }
        [Dependency]
        public IClienteBL clienteService { get; set; }

        private const string KEYVENTA = "venta";

        protected void Page_Load(object sender, EventArgs e)
        {
            var opc = Request.QueryString["opc"];
            var idPedido = Request.QueryString["id"];

            if (!Page.IsPostBack)
            {
                if (opc != null && opc == "nuevo")
                {
                    var nuevaVenta = new Venta()
                    {
                        Fecha = DateTime.Now
                    };

                    BindingVenta(nuevaVenta);

                    ViewState["opc"] = opc;
                }
                else if (opc != null && opc == "editar" && idPedido != null)
                {
                    var venta = ventaService.GetFromVentasById(Int32.Parse(idPedido.ToString()));

                    BindingVenta(venta);

                    ViewState["opc"] = opc;
                }
                else if (opc != null && opc == "delete" && idPedido != null)
                {
                    var id = Int32.Parse(idPedido.ToString());

                    ventaService.RemoveVenta(id);
                    Response.Redirect("frmListVentas.aspx");
                }
            } 
        }

        public IQueryable<Producto> GetProductos([Control("txtCriterio")] string criterio)
        {
            return productoService.GetFromProductosByCriterio(criterio).AsQueryable();
        }

        private void BindingVenta(Venta venta)
        {
            txtCodigo.Text = venta.Id.ToString();
            txtFecha.Text = venta.Fecha.ToShortDateString();

            if (venta.Cliente != null)
            {
                txtRuc.Text = venta.Cliente.RucCliente;
                txtCliente.Text = venta.Cliente.NombreCliente;
                txtDireccion.Text = venta.Cliente.DireccionCliente;
            }

            venta.Total = venta.DetalleVenta.Sum(dp => dp.Monto);

            lvDetalleVenta.DataSource = venta.DetalleVenta;
            lvDetalleVenta.DataBind();

            var lblTotal = lvDetalleVenta.FindControl("lblTotal") as Label;

            if (lblTotal != null)
                lblTotal.Text = venta.Total.ToString();
            //actualizo el cache
            Cache.Insert(KEYVENTA, venta);
        }

        private Venta GetVenta()
        {
            return Cache.Get(KEYVENTA) as Venta;
        }

        protected void lvDetalleVenta_ItemCommand(object sender, ListViewCommandEventArgs e)
        {
            if (e.CommandName == "QuitarDetalle")
            {
                var idProducto = Int32.Parse(e.CommandArgument.ToString());

                //recupera pedido del cache
                var venta = GetVenta();

                var detalle = venta.DetalleVenta.Where(dp => dp.IdProducto == idProducto).SingleOrDefault();

                if (detalle != null)
                    venta.DetalleVenta.Remove(detalle);

                BindingVenta(venta);
            }
            else if (e.CommandName == "ActualizarDetalle")
            {
                var venta = GetVenta();

                foreach (var row in lvDetalleVenta.Items)
                {
                    var txtCantidad = row.FindControl("txtCantidad") as TextBox;
                    var txtPrecio = row.FindControl("txtPrecio") as TextBox;

                    venta.DetalleVenta.ToList()[row.DisplayIndex].Cantidad = decimal.Parse(txtCantidad.Text);
                    venta.DetalleVenta.ToList()[row.DisplayIndex].PrecioUnit = decimal.Parse(txtPrecio.Text);
                }

                BindingVenta(venta);
            }
        }

        protected void btnGuardar_Click(object sender, EventArgs e)
        {
            var venta = GetVenta();

            venta.Fecha = DateTime.Parse(txtFecha.Text);


            if (venta != null)
            {
                if (ViewState["opc"].ToString().Equals("nuevo"))
                {
                    ventaService.AddVenta(venta);
                    ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "alertMessage", "alert('VENTA Registrada..!!')", true);
                    Response.Redirect("frmListVentas.aspx");
                }
                else if (ViewState["opc"].ToString().Equals("editar"))
                {
                    ventaService.UpdateVenta(venta);
                }
            }
        }

        protected void lvProductos_ItemCommand(object sender, ListViewCommandEventArgs e)
        {
            if (e.CommandName == "AddDetalle")
            {
                var productoId = Int32.Parse(e.CommandArgument.ToString());


                var venta = GetVenta();

                var existe = venta.DetalleVenta.Where(dp => dp.IdProducto == productoId).SingleOrDefault();

                if (existe != null)
                {
                    existe.Cantidad += 1;
                }
                else
                {
                    var producto = productoService
                        .GetFromProductosById((productoId));

                    var newDetalle = new DetalleVenta()
                    {
                        IdVenta = venta.Id,
                        IdProducto = producto.Id,
                        Producto = producto,
                        PrecioUnit = producto.Precio,
                        Cantidad = 1
                    };

                    venta.DetalleVenta.Add(newDetalle);
                }
                venta.Total = venta.DetalleVenta.Sum(i => i.Monto);
                BindingVenta(venta);
            }

        }

        protected void btnBuscarCliente_Click(object sender, EventArgs e)
        {
            var rucDni = txtRuc.Text;

            var cliente = clienteService.GetFromClienteByDni(rucDni);

            var venta = Cache.Get(KEYVENTA) as Venta;

            if (cliente == null)
            {
                //lblMsgCliente.Text = "El cliente no existe !!!";
                txtRuc.Text = "";
                txtCliente.Text = "";

                venta.Cliente = null;
            }
            else
            {
                venta.ClienteId = cliente.Id;
                venta.Cliente = cliente;

                Cache.Insert(KEYVENTA, venta);

                txtRuc.Text = cliente.RucCliente;
                txtCliente.Text = cliente.NombreCliente;
                txtDireccion.Text = cliente.DireccionCliente;
                //lblMsgCliente.Text = "";
            } 
        }

    }
}
